package com.bjxst.web.servlet;

import com.bjxst.commons.Constants;
import com.bjxst.exception.UserNotFoundException;
import com.bjxst.pojo.Users;
import com.bjxst.service.UserLoginService;
import com.bjxst.service.impl.UserLoginServiceImpl;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/*服务端与客服端建立会话状态
*  用户只能在一处登录  在servletContext中根据userid取得用户的session 判断是否存在
* 在login.jsp中加上  作用：判断用户只在一处登录
        if(window.parent.length>0){
                当前页面有父窗口，就跳回登录面页面
                window.parent.location="login.jsp";
                }    */

/*在servlet服务端是与前端面连接，取到前端页面的数据，在service业务层执行，在dao持久层
* 用jdbc 将数据放进mysql数据库，进行添加用户，查询用户等等*/
@WebServlet("/login.do")
public class UserLoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*在login.jsp中form表单中 当点击提交时，会传进username与userpwd
        * 所以先要获得username 与userpwd*/
        String username = req.getParameter("username");
        String userpwd = req.getParameter("userpwd");
        String code = req.getParameter("code");//取用户输入的验证码
        try{
            //建立客户端与服务端的会话状态  可以用session或cookie
            //通过session对比用户输入的与系统的验证码是否一样
            HttpSession session = req.getSession();
            //系统的验证码
            String codeTemp = (String) session.getAttribute(Constants.VALIDATE_CODE_KEY);
            if(codeTemp.equals(code)){
                //获得登录的用户
                UserLoginService userLoginService = new UserLoginServiceImpl();
                Users users = userLoginService.userLogin(username,userpwd);

                //这里的第一个 “users” 是常量   后面做修改不方便 每次修改都要在session中修改
                //session.setAttribute("users",users);
                //定义一个常量类，修改一次，就可以全改好
                session.setAttribute(Constants.USER_SESSION_KEY,users);

                //用户只能在一处登录  在servletContext中根据userid取得（用户）session 判断是否存在
                ServletContext servletContext = this.getServletContext();
                //加双引号 是强转为String类型
                HttpSession temp = (HttpSession) servletContext.getAttribute(users.getUserid()+"");
                //判断用户是否登录  用户不是空的，说明已经登录过，将之前的数据删除，重新登录
                if(temp != null){
                    //在servletContext中删除
                    servletContext.removeAttribute(users.getUserid()+"");
                    //Invalidate( ) ：使整个窗口客户区无效, 并进行更新显示的函数
                    temp.invalidate();
                }
                //将新的登录放进ServletContext  这里是放session 而不是temp
                servletContext.setAttribute(users.getUserid()+"",session);
                //跳转到首页  请求转发    重定向
                //req.getRequestDispatcher("xxx.jsp").forword(req,resp);
                //这里要用重定向  因为要改变地址url  用户登录后，跳转到登录页面，所以要改变url
                resp.sendRedirect("main.jsp");
            }else {
                req.setAttribute(Constants.REQUEST_MSG,"输入验证码错误");
                req.getRequestDispatcher("login.jsp").forward(req,resp);
            }


        }catch (UserNotFoundException e){
            //当在业务层，查不到用户时 会抛出异常
            //当登录不成功，跳转到登录页面  是同一个地址 所以用请求转发
            req.setAttribute("msg",e.getMessage());
            req.getRequestDispatcher("login.jsp").forward(req,resp);


        }catch (Exception e){
            //这是抛出所有导异常  这已经是servlet（服务端）,下一步是tomcat ,
            //当tomcat接收到异常时会在客户端显示
            //在这里抛出所有异常，那么tomcat就不会有异常抛出
            /*当系统出现错误时，跳转到错误页面
            * 重定向  因为是新的url*/
            resp.sendRedirect("error.jsp");
            e.printStackTrace();
        }

    }
}
